package model

import (
	"time"

	"gorm.io/gorm"
)

// Menu 菜单模型
type Menu struct {
	ID        uint           `json:"id" gorm:"primaryKey"`
	ParentID  uint           `json:"parent_id" gorm:"default:0;comment:父菜单ID，一级菜单为0"` // 父菜单ID
	Name      string         `json:"name" gorm:"size:50;not null;comment:菜单名称"`       // 路由名称，如Dashboard
	Path      string         `json:"path" gorm:"size:100;not null;comment:菜单路径"`      // 路由路径，如/dashboard
	Component string         `json:"component" gorm:"size:100;comment:组件路径"`          // 组件路径，如Layout或dashboard/index
	Redirect  string         `json:"redirect" gorm:"size:100;comment:重定向地址"`          // 重定向地址
	Title     string         `json:"title" gorm:"size:50;not null;comment:菜单标题"`      // 菜单标题，显示在菜单上的文字
	Icon      string         `json:"icon" gorm:"size:50;comment:菜单图标"`                // 菜单图标
	Sort      int            `json:"sort" gorm:"default:0;comment:排序标记"`              // 排序，数字越小越靠前
	Hidden    bool           `json:"hidden" gorm:"default:false;comment:是否隐藏"`        // 是否在菜单中隐藏
	KeepAlive bool           `json:"keep_alive" gorm:"default:false;comment:是否缓存"`    // 是否缓存
	IsFrame   bool           `json:"is_frame" gorm:"default:false;comment:是否外链"`      // 是否外链
	Status    int            `json:"status" gorm:"default:1;comment:菜单状态"`            // 菜单状态(1:正常 0:禁用)
	Roles     []*Role        `json:"roles" gorm:"many2many:role_menus;"`              // 角色列表，多对多关系
	Children  []*Menu        `json:"children" gorm:"-"`                               // 子菜单，不映射到数据库
	CreatedAt time.Time      `json:"created_at"`
	UpdatedAt time.Time      `json:"updated_at"`
	DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
}

// TableName 返回表名
func (Menu) TableName() string {
	return "menus"
}

// RoleMenu 角色菜单关联模型
type RoleMenu struct {
	RoleID uint `json:"role_id" gorm:"primaryKey;not null;index:idx_role_menu,unique"` // 角色ID
	MenuID uint `json:"menu_id" gorm:"primaryKey;not null;index:idx_role_menu,unique"` // 菜单ID
}

// TableName 返回表名
func (RoleMenu) TableName() string {
	return "role_menus"
}
